package com.yanggu.scala.chapater18.lowerbounds

//Java中下界
//在 Java 泛型里表示某个类型是 A类型的父类型，使用 super 关键字。<T super A>
//或用通配符的形式： <? super A>

//scala中下界
//在 scala 的下界或下限，使用 >: 关键字，语法如下：[T >: A]
//或用通配符:[_ >: A]

//scala使用下界小结
//对于下界，可以传入任意类型
//传入和Animal直系的，是Animal父类的还是父类处理，是Animal子类的按照Animal处理
//和Animal无关的，一律按照Object处理
//也就是下界，可以随便传，只是处理是方式不一样, 编译器也不会报错, 是可以执行的, 只是丢失了泛型信息
//不能使用上界的思路来类推下界的含义
object LowerBoundsDemo1 {

  def main(args: Array[String]): Unit = {

    biophony(Seq(new Earth, new Earth)).foreach(_.sound())

    biophony(Seq(new Animal, new Animal)).foreach(_.sound())

    biophony(Seq(new Bird, new Bird)).foreach(_.sound())

    val res = biophony(Seq(new Bird))

    val res2 = biophony(Seq(new Object))

    val res3 = biophony(Seq(new Moon))
    println("res = " + res)
    println("res2 = " + res2)
    println("res3 = " + res3)

  }
  def biophony[T >: Animal](things: Seq[T]) = things
}


class Earth { //Earth 类

  def sound(){ //方法
    println("hello !")
  }

}
class Animal extends Earth{

  //重写了Earth的方法sound()
  override def sound() ={
    println("animal sound")
  }

}
class Bird extends Animal{

  //将Animal的方法重写
  override def sound()={
    println("bird sounds")
  }

}

class Moon
